/*********************************************************************************
 *      Copyright:  (C) 2020 Juan
 *                  All rights reserved.
 *
 *       Filename:  G4module_server.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(22/07/20)
 *         Author:  wangruijie <1046299465@qq.com>
 *      ChangeLog:  1, Release initial version on "22/07/20 03:09:18"
 *                 
 ********************************************************************************/
#include"G4module_server.h"

int main(int argc, char **argv)
{
    int                    sockfd = -1;   //赋一个无关紧要的值
    int                    rv = -1;
    struct sockaddr_in     local_addr;   //网络地址结构体
    struct event_base*     base = event_base_new();   //用以创建一个事件处理的全局变量，可以理解为这是一个负责集中处理各种出入IO事件的总管家
    struct event           listen_ev;  //创建一个event对象
    int                    opt;
    char                   buf[1024];
    char                   *progname = NULL;
    int                    SERVER_PORT;
    struct sock_ev_write   *sock_ev_write_struct;

    struct option            long_options[]=
    {
        {"port", required_argument, NULL, 'p'},
        {"help", no_argument, NULL, 'h'},
        {NULL, 0, NULL, 0}
    };

    progname = basename(argv[0]);

    while((opt = getopt_long(argc,argv,"p:h",long_options,NULL))!=-1)
    {
        switch(opt)
        {
            case 'p':
                SERVER_PORT = atoi(optarg);
                break;

            case 'h':
                print_usage(progname);
                return EXIT_SUCCESS;

            default:
                break;
        }
    }

    if(!SERVER_PORT)
    {
        print_usage(argv[0]);
        return 0;
    }

    /* 创建一个socket */
    sockfd = socket(AF_INET, SOCK_STREAM, 0 );
    if(sockfd < 0)
    {
        printf("set up socket error:%s\n", strerror(errno));
        return -1;
    }

    memset(&local_addr, 0, sizeof(local_addr));    //清零结构体
    local_addr.sin_family=AF_INET;       //设置为IP通信
    local_addr.sin_addr.s_addr=htonl(INADDR_ANY);     //服务器IP地址
    local_addr.sin_port=htons(SERVER_PORT);          //服务器端口号

    /* bind 创建的socket的文件描述符 */
    rv = bind(sockfd, (struct sockaddr*) &local_addr, sizeof(struct sockaddr));
    if(rv < 0)
    {
        printf("bind error:%s\n", strerror(errno));
        return -2;
    }

    /* 开始监听socket */
    listen(sockfd, BACK_LOG);
    printf("Start listening for client connections.....\n");

    /* 将其监听的socket托管给event_base,指定要监听的事件类型，并绑上相应的回调函数 */
    event_set(&listen_ev, sockfd, EV_READ|EV_PERSIST, on_accept, NULL);
    event_base_set(base, &listen_ev);
    /* 通过event_add方法启动监听事件 */
    event_add(&listen_ev, NULL);

    /* 启动event_base的循环，开始循环处理发生的事件 */
    event_base_dispatch(base);

    /* 清理需要释放和关闭的描述符 */
    event_del(&listen_ev);


    return 0;

}
